﻿#pragma once
#include <opencv2/opencv.hpp>

//枚举形状类型
enum Shapetype {
	Circle = 0,
	Rect = 1,
	ShapeNone = 2
};

//拟合的形状（作为存储）
struct Shape {
	cv::Point2f Circle;
	cv::RotatedRect Rect;
};

//图像的颜色
enum Matcolor {
	Black = 0,
	White = 1,
	ColorNone = 2
};

//用户设置参数（属性）
struct Attribute {
	Shapetype type = Shapetype::ShapeNone;
	Shape shape;
	Matcolor color = Matcolor::ColorNone;

	double width = -1.0;
	double height = -1.0;
	double threshold = -1.0;

	float radius = -1.0;
};

//fit拟合所需要的参数（同样也用结构体存储，以便后续变化，加入其它需要拟合的参数）
struct Params {
	float radius = 0;
};

class MaskBase
{
public:
	MaskBase();
	~MaskBase();

	//图像预处理
	virtual int preprocess(cv::Mat& mat, Attribute &attr) {
		return 0;
	}
	virtual int findMaxOutline(cv::Mat& mat) {
		return 0;
	}
	//寻找满足条件的所有轮廓
	virtual int findMaxOutline(cv::Mat& mat, Attribute &attr) {
		return 0;
	}
	//拟合轮廓并绘画
	virtual int draw(cv::Mat& mat, Attribute& attr) {
		return 0;
	}
	//获取图中最终或者目标轮廓的中心
	virtual cv::Point2f getMaxOutlineCenter(Attribute& attr) {
		return {};
	}
	//在图中指定位置画十字中心
	virtual int drawCross(cv::Mat& mat, cv::Point2f center, const size_t crosslen) {
		return 0;
	}
	//计算图中指定位置与轮廓圆心的距离
	virtual double CalculatePTOPDistance(cv::Point2f center1) {
		return 0.0;
	}
	//计算图中指定位置与指定位置的距离
	virtual double CalculatePTOPDistance(cv::Point2f center1, cv::Point2f center2) {
		return 0.0;
	}
	//判断计算出的距离是否在给定的阈值范围之内
	virtual bool isCover(double distance, const double threshold) {
		return true;
	}
	//将灰度图转成GRB以便后面进行彩色绘画
	void setMaskGrayToRGB(cv::Mat& mat) {
		cv::cvtColor(mat, mat, cv::COLOR_GRAY2BGR);
	}
	//获取图像中心
	virtual cv::Point2f getMaskCenter(cv::Mat& mat) {
		return {};
	}
	//获取两个圆孔的中心
	virtual cv::Point2f* getTwoRoundholeCenter(cv::Mat& mat, Attribute& attr) {
		return NULL;
	}
};

